package com.ycj.design.create.singleton;

import java.time.Instant;

/**
 * 饿汉式（静态常量）
 * 优点：这种写法简单，就是在类装载的时候就完成了实例化。永远都是同一个实例，避免了线程同步问题
 * 缺点：在类装载的时候就完成实例化，没有达到lazy loading的效果。如果从始至终从未使用过这个实例，则会造成内存的浪费
 * @author chuanjieyang
 * @date Nov 20, 2018 10:27:04 AM
 */
public class SingletonPatternOne {
    /**
     * 单例模式要求类能够返回对象一个引用（永远是同一个）和一个获得该实例的方法
     * （必须是静态方法，通常使用getInstance这个名称）
     * 基本实现思路：
     * 1.将该类的构造方法定义为私有方法，这样其他处的代码就无法通过调用该类的构造函数实例化该类的对象
     * 只有通过该类提供的静态工厂方法来得到该类的唯一实例；
     * 2.在该类内提供一个静态方法，当我们调用这个方法时，如果类持有的引用不为空就返回这个引用，
     * 如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。
     * 注意事项：
     * 单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时，有两个线程同时调用创建方法，
     * 那么它们同时没有检测到唯一实例的存在，从而同时各自创建了一个实例，这样就有两个实例被构造出来，
     * 从而违反了单例模式中实例唯一的原则。
     * 解决这个问题的办法就是提供一个互斥锁（但会降低效率）
     */

    private static final SingletonPatternOne INSTANCE = new SingletonPatternOne();
    private SingletonPatternOne(){}
    public static SingletonPatternOne getInstance(){
        return INSTANCE;
    }


    private Integer id;
    private String name;
    private Instant age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Instant getAge() {
        return age;
    }

    public void setAge(Instant age) {
        this.age = age;
    }

}
